/**
 * Copyright (C) 2008 The Android Open Source Project
 *
 * Licensed under the Apache License, Version 2.0 (the "License");
 * you may not use this file except in compliance with the License.
 * You may obtain a copy of the License at
 *
 *      http://www.apache.org/licenses/LICENSE-2.0
 *
 * Unless required by applicable law or agreed to in writing, software
 * distributed under the License is distributed on an "AS IS" BASIS,
 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
 * See the License for the specific language governing permissions and
 * limitations under the License.
 */

package com.xindao.widget;

import android.content.Context;
import android.graphics.Bitmap;
import android.graphics.Canvas;
import android.graphics.Paint;
import android.graphics.PixelFormat;
import android.os.IBinder;
import android.view.Gravity;
import android.view.KeyEvent;
import android.view.View;
import android.view.ViewGroup;
import android.view.WindowManager;

public class DragView extends View {
  private Bitmap mBitmap;
  private Paint mPaint;
  private int mRegistrationX;
  private int mRegistrationY;

  private float mAnimationScale = 1.0f;

  private WindowManager.LayoutParams mLayoutParams;
  private WindowManager mWindowManager;

  /**
   * Construct the drag view.
   * <p>
   * The registration point is the point inside our view that the touch events
   * should be centered upon.
   * 
   * @param context
   *          A context
   * @param bitmap
   *          The view that we're dragging around. We scale it up when we draw
   *          it.
   * @param registrationX
   *          The x coordinate of the registration point.
   * @param registrationY
   *          The y coordinate of the registration point.
   */
  public DragView(Context context, Bitmap bitmap, int registrationX, int registrationY, int left, int top, int width, int height) {
    super(context);
    mWindowManager = (WindowManager) context.getSystemService(Context.WINDOW_SERVICE);
    mBitmap = Bitmap.createBitmap(bitmap, left, top, width, height, null, false);
    mRegistrationX = registrationX;
    mRegistrationY = registrationY;
  }

  @Override
  protected void onMeasure(int widthMeasureSpec, int heightMeasureSpec) {
    setMeasuredDimension(mBitmap.getWidth(), mBitmap.getHeight());
  }

  @Override
  protected void onDraw(Canvas canvas) {
    float scale = mAnimationScale;
    if (scale < 0.999f) { // allow for some float error
      float width = mBitmap.getWidth();
      float offset = (width - (width * scale)) / 2;
      canvas.translate(offset, offset);
      canvas.scale(scale, scale);
    }
    canvas.drawBitmap(mBitmap, 0.0f, 0.0f, mPaint);
  }

  @Override
  protected void onDetachedFromWindow() {
    super.onDetachedFromWindow();
    mBitmap.recycle();
  }

  /**
   * Create a window containing this view and show it.
   * 
   * @param windowToken
   *          obtained from v.getWindowToken() from one of your views
   * @param touchX
   *          the x coordinate the user touched in screen coordinates
   * @param touchY
   *          the y coordinate the user touched in screen coordinates
   */
  public void show(IBinder windowToken, int touchX, int touchY) {
    WindowManager.LayoutParams lp;
    int pixelFormat;

    pixelFormat = PixelFormat.TRANSLUCENT;

    lp = new WindowManager.LayoutParams(ViewGroup.LayoutParams.WRAP_CONTENT, ViewGroup.LayoutParams.WRAP_CONTENT, touchX - mRegistrationX, touchY - mRegistrationY,
        WindowManager.LayoutParams.TYPE_APPLICATION_SUB_PANEL, WindowManager.LayoutParams.FLAG_LAYOUT_IN_SCREEN | WindowManager.LayoutParams.FLAG_LAYOUT_NO_LIMITS
        /* | WindowManager.LayoutParams.FLAG_ALT_FOCUSABLE_IM */, pixelFormat);
    // lp.token = mStatusBarView.getWindowToken();
    lp.gravity = Gravity.LEFT | Gravity.TOP;
    lp.token = windowToken;
    lp.setTitle("DragView");
    // lp.flags = WindowManager.LayoutParams.FLAG_LAYOUT_IN_SCREEN;
    mLayoutParams = lp;

    mWindowManager.addView(this, lp);

    mAnimationScale = 1.0f / 0.5f;
    // mTween.start(true);
  }

  /**
   * Move the window containing this view.
   * 
   * @param touchX
   *          the x coordinate the user touched in screen coordinates
   * @param touchY
   *          the y coordinate the user touched in screen coordinates
   */
  void move(int touchX, int touchY) {
    WindowManager.LayoutParams lp = mLayoutParams;
    lp.x = touchX - mRegistrationX;
    lp.y = touchY - mRegistrationY;
    mWindowManager.updateViewLayout(this, lp);
  }

  void remove() {
    mWindowManager.removeView(this);
  }

  @Override
  public boolean isInEditMode() {
    return true;
  }

  @Override
  public boolean onKeyDown(int keyCode, KeyEvent event) {
    if (keyCode == KeyEvent.KEYCODE_BACK) {
      remove();
      return true;
    }
    return super.onKeyDown(keyCode, event);
  }

}
